package log

import (
	"io"
	"sync"
)

/* //* 全局日志管理实现，提供单例模式的日志管理器访问，支持全局日志级别设置和日志记录器获取 */

/*
全局日志管理器
*/

var (
	globalManager *Manager
	once          sync.Once // 用于保证初始化唯一的同步工具
)

//* go 如何实现单例，这里就看到go的包管理机制：
/*
 Go 的编译和链接过程直接相关：
编译阶段：每个包会被编译为独立的目标文件（.o），但包内的全局变量（如 globalManager、once）会被标记为 “全局符号”。
链接阶段： linker（链接器）会将所有目标文件合并为一个可执行文件，此时会对 “全局符号” 进行去重—— 无论一个包被多少个其他包引用，其全局变量只会保留一份内存地址。
运行阶段：程序启动时，Go 运行时会按照包的依赖关系（从无依赖的基础包到依赖它的包）依次初始化每个包，每个包仅初始化一次（执行包级变量的初始化和 init() 函数）。
例如：如果 package A 和 package B 都导入了 package log，那么：
package log 的包级变量（globalManager、once）在内存中只有一份；
package log 的初始化逻辑（如变量赋值、init() 函数）只会执行一次；
A 和 B 访问的 log.GetManager() 本质上是在操作同一块内存中的 globalManager 和 once。
*/

// GetManager 获取全局日志管理器（单例）
func GetManager() *Manager {
	// 关键：通过 once.Do 确保初始化逻辑只执行一次
	once.Do(func() {
		//确保全局日志函数不会在日志系统未初始化时调用
		globalManager = NewManager()
		// 创建默认日志记录器
		globalManager.SetLogger("default", NewStdLogger(LevelInfo))
	})
	return globalManager
}

// 获取全局日志记录器
func GetLogger(name string) Logger {
	return GetManager().GetLogger(name)
}

// SetLevel 设置全局日志级别
func SetLevel(level Level) {
	GetManager().SetLevel(level)
}

// 设置全局日志输出
func SetOutput(w io.Writer) {
	GetLogger("default").SetOutput(w)
}

// SetLogger 设置全局日志记录器
func SetLogger(name string, logger Logger) {
	GetManager().SetLogger(name, logger)
}

// 便捷函数

// Debug 使用默认日志记录器记录调试级别日志
func Debug(args ...interface{}) {
	GetLogger("default").Debug(args...)
}

// Debugf 使用默认日志记录器记录调试级别日志（格式化）
func Debugf(format string, args ...interface{}) {
	GetLogger("default").Debugf(format, args...)
}

// Info 使用默认日志记录器记录信息级别日志
func Info(args ...interface{}) {
	GetLogger("default").Info(args...)
}

// Infof 使用默认日志记录器记录信息级别日志（格式化）
func Infof(format string, args ...interface{}) {
	GetLogger("default").Infof(format, args...)
}

// Warn 使用默认日志记录器记录警告级别日志
func Warn(args ...interface{}) {
	GetLogger("default").Warn(args...)
}

// Warnf 使用默认日志记录器记录警告级别日志（格式化）
func Warnf(format string, args ...interface{}) {
	GetLogger("default").Warnf(format, args...)
}

// Error 使用默认日志记录器记录错误级别日志
func Error(args ...interface{}) {
	GetLogger("default").Error(args...)
}

// Errorf 使用默认日志记录器记录错误级别日志（格式化）
func Errorf(format string, args ...interface{}) {
	GetLogger("default").Errorf(format, args...)
}

// Fatal 使用默认日志记录器记录致命错误级别日志并退出程序
func Fatal(args ...interface{}) {
	GetLogger("default").Fatal(args...)
}

// Fatalf 使用默认日志记录器记录致命错误级别日志（格式化）并退出程序
func Fatalf(format string, args ...interface{}) {
	GetLogger("default").Fatalf(format, args...)
}
